//
// Created by sjjmw on 3/24/2022.
//

//应该使用dfs

#include "iostream"
#include "vector"
#include "list"
#include "algorithm"
#include "string"
#include "unordered_map"
#include "cmath"
#include<iomanip>
#include "string"
#include "map"
#include "list"
struct Sol{
    int h;
    int w;
    std::vector<std::vector<int>> mat;
    std::vector<std::pair<int,int>> dirs=
            {{1,0},{-1,0},
             {0,1},{0,-1}};
//    std::vector<std::vector<char>> walked;
    bool in_range(int x,int y){
        return (x>=0&&x<w&&y>=0&&y<h);
    }
    int max_len=0;
    void dfs(int x,int y,int len){
        if(len>max_len){
            max_len=len;
        }
        for(auto dir:dirs){
            int x1=x+dir.first;
            int y1=y+dir.second;
            if(in_range(x1,y1)){
                if(mat[y1][x1]>mat[y][x]){
                    dfs(x1,y1,len+1);
                }
            }
        }
    }
    void handle(
            int h1,int w1
            ){
        h=h1;w=w1;
        mat.reserve(h);
        std::vector<int> line(w);
//        std::string str;
//        std::getline(std::cin,str);
        for(int i=0;i<h;i++){
            for(int j=0;j<line.size();j++){
                std::cin>>line[j];
            }
//            std::getline(std::cin,str);
//            walked.push_back(line);
            mat.push_back(line);
        }
        for(int i=0;i<h;i++){
            for(int j=0;j<line.size();j++){
                dfs(j,i,1);
            }
        }
        printf("%d\n",max_len);
        ;
    }
};
int main(){
    int a,b,c;
//    float a,b,c,d;
    int e;
    while(std::cin>>a>>b){
        Sol().handle(a,b);
    }

    return 0;
}